home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
KEYWITCH
/
KW_S200.LZH
/
SXKeyW.s
< prev
next >
Wrap
Text File
|
1995-03-20
|
7KB
|
459 lines
.include w01dos.mac
.include w02iocs.mac
.include w03const.mac
.include KWCall.mac
;SXコールマクロとコール番号
SXCALL .macro num
.dc.w num
.endm
__MMChHdlNew equ $A021
__MMHdlDispose equ $A038
__KBSimulate equ $A089
__KBTini equ $A08E
__KBCurKbrGet equ $A08F
__GMSetGraph equ $A131
__GMShadowStrZ equ $A1A1
__DMOpen equ $A2C3
__DMDispose equ $A2C6
__DMControl equ $A2C7
__DMBeep equ $A2D7
__TSExit equ $A352
__TSEventAvail equ $A357
__TSGetTdb equ $A35B
__TSGetID equ $A360
__SXSearchFname equ $A3D4
__SXGetDispRect equ $A432
;ワークエリア
.offset 0
oldKeyInt: .ds.l 1
oldKeyErr: .ds.l 1
oldKeyProc: .ds.l 1
eventRec: .ds.b 18
tdbPtr: .ds.b 512
.even
.ds.b 8192
workSize:
;コモンエリア
.offset 0
releaseFlag: .ds.b 1
.even
commonSize:
;イベントマネージャのイベントレコード
.offset 0
eWhat: .ds.w 1
eWith: .ds.l 1
eWhen: .ds.l 1
eWhere: .ds.l 1
eHow: .ds.l 1
event:
EM_EVERY equ $FFFF
;タスクマネージャのイベントレコード
.offset 0
tnWhat: .ds.w 1
tnWhom: .ds.l 1
tnWhen: .ds.l 1
tnWhom2: .ds.l 1
tnWhat2: .ds.w 1
tnTskid: .ds.w 1
tnEvent:
TS_ENDTSK equ 1
TS_CLOSEALL equ 2
TS_SAVE equ 31
TS_SELECT equ 32
;キーボードマネージャのキーボードレコード
.offset 0
.ds.w 1 ;1
kbBufSiz: .ds.w 1 ;バッファサイズ(1024まで)
kbBuffer: .ds.l 1 ;キーバッファの先頭
kbReadPtr: .ds.l 1 ;読み出し位置
kbWritePtr: .ds.l 1 ;書き込み位置
kbShift: .ds.l 1 ;シフトキービット
kbLastKey: .ds.w 1 ;割り込みで入力された生のキーデータ(上位バイトは無効)
kbXf2Opt1: .ds.b 1 ;[0]XF2でOPT.1をシミュレートする
kbResetOn: .ds.b 1 ;[1]キーボードのリセットに対応する
kbOldOn: .ds.b 1 ;[2]元のキー入力割り込みを使う
kbLedOn: .ds.b 1 ;[3]KBShiftSetでLEDCTRLする
kbClickOn: .ds.b 1 ;[4]クリックを鳴らす
kbAssignOn: .ds.b 1 ;[5]キーアサインテーブルを有効にする
kbAutoRept: .ds.b 1 ;[6]オートリピートする
kbGetReset: .ds.b 1 ;キーボードのリセットが発生した
.ds.b 1 ;BREAK
.ds.b 1 ;COPY
.ds.b 1 ;CTRL+C
.ds.b 1 ;CTRL+D
.ds.b 1 ;CTRL+N
.ds.b 1 ;CTRL+P
.ds.b 1 ;CTRL+Q
.ds.b 1 ;CTRL+S
.ds.b 10 ;(未使用)
kbMap: .ds.b $80 ;キーの状態
kbAssignMap: .ds.b $80 ;キーアサインテーブル
.text
moduleHead:
.dc.l 'OBJR'
.dc.l moduleTail-moduleHead
.dc.l moduleEntry-moduleHead
.dc.l workSize
.dc.l commonSize
.dc.l 0,0,0
execEntry:
DOS _EXIT
;キー入力エラー割り込みルーチン
keyErr:
tst.b UDR
rte
;キー入力割り込みルーチン
keyInt:
movem.l d0-d2/a0-a1,-(sp)
moveq.l #0,d2
move.b UDR,d2 ;スキャンコード
SXCALL __KBCurKbrGet
movea.l d0,a1 ;キーボードレコードのアドレス
move.w d2,kbLastKey(a1)
cmp.b #$FE,d2
bcc keyInt_init ;初期化
tst.b kbAssignOn(a1)
beq keyIntNotAssign ;キーアサインテーブルを使わない
lea.l kbAssignMap(a1),a0
moveq.l #$7F,d0
and.b d2,d0
eor.b d0,d2
or.b (a0,d0.w),d2
keyIntNotAssign:
KWCall __KWSimulate ;入力
tst.b kbXf2Opt1(a1)
beq keyIntEnd ;XF2をOPT.1として使わない
add.b d2,d2
cmp.b #$56*2,d2 ;XF2か
bne keyIntEnd ;違う
move.b #$72,d2 ;OPT.1にする
lsr.w #1,d2
KWCall __KWSimulate ;入力
keyIntEnd:
movem.l (sp)+,d0-d2/a0-a1
rte
keyInt_init:
beq keyInt_compact
;初期化
st.b kbGetReset(a1)
tst.b kbResetOn(a1)
beq keyIntEnd
move.l a1,-(sp)
SXCALL __KBTini
addq.l #4,sp
move.b SR_LED,d1
IOCS _KEY_INIT
bra keyIntEnd
;Compact
keyInt_compact:
moveq.l #1,d2
KWCall __KWCompact
bra keyIntEnd
;__KWKeyProcで差し換えるルーチン
keySimulate:
move.l d1,-(sp)
SXCALL __KBCurKbrGet
move.l d0,-(sp)
SXCALL __KBSimulate
addq.l #4,sp
move.l (sp)+,d0
rts
;実行開始位置
moduleEntry:
tst.w d1
bne moduleAbort ;2回目は無視
movea.l a1,a5
bsr init
bmi moduleAbort
eventLoop:
pea.l eventRec(a5)
move.w #EM_EVERY,-(sp)
SXCALL __TSEventAvail
addq.l #6,sp
moveq.l #$0F,d0
and.w eventRec+tnWhat(a5),d0
add.w d0,d0
move.w eventTable(pc,d0.w),d0
jsr eventTable(pc,d0.w)
bpl eventLoop
bsr tini
moduleAbort:
clr.w -(sp)
SXCALL __TSExit
eventTable:
.dc.w idle-eventTable
.dc.w leftDown-eventTable
.dc.w leftUp-eventTable
.dc.w rightDown-eventTable
.dc.w rightUp-eventTable
.dc.w keyDown-eventTable
.dc.w keyUp-eventTable
.dc.w update-eventTable
.dc.w reserv1-eventTable
.dc.w activate-eventTable
.dc.w reserv2-eventTable
.dc.w reserv3-eventTable
.dc.w system1-eventTable
.dc.w system2-eventTable
.dc.w user1-eventTable
.dc.w user2-eventTable
;初期化
init:
KWCall __KWVersion
swap.w d0
cmp.w #'KW',d0
bne keyWitchNotFound
moveq.l #1,d2
KWCall __KWIntMode
lea.l keySimulate(pc),a1
KWCall __KWKeyProc
move.l d0,oldKeyProc(a5)
pea.l keyInt(pc)
move.w #KEYINT,-(sp)
DOS _INTVCS
move.l d0,oldKeyInt(a5)
pea.l keyErr(pc)
move.w #KEYERR,-(sp)
DOS _INTVCS
move.l d0,oldKeyErr(a5)
lea.l 12(sp),sp
init_9:
moveq.l #0,d0
rts
init_99:
moveq.l #-1,d0
rts
;KeyWitch2が組み込まれていない
keyWitchNotFound:
move.w #2,-(sp)
SXCALL __DMBeep
addq.l #2,sp
move.l #itemListEnd-itemList,-(sp)
SXCALL __MMChHdlNew
addq.l #4,sp
movea.l d0,a3
movea.l (a3),a0
lea.l itemList(pc),a1
move.w #(itemListEnd-itemList)/2-1,d0
copyItemList:
move.w (a1)+,(a0)+
dbra d0,copyItemList
subq.l #8,sp
move.l sp,-(sp)
SXCALL __SXGetDispRect
addq.l #4,sp
movem.w (sp)+,d0-d3
add.w d2,d0
lsr.w #1,d0
move.w d0,d2
moveq.l #180/2,d4
sub.w d4,d0
add.w d4,d2
add.w d3,d1
lsr.w #1,d1
move.w d1,d3
moveq.l #80/2,d4
sub.w d4,d1
add.w d4,d3
movem.w d0-d3,-(sp)
move.l a3,-(sp)
SXCALL __TSGetID
move.l d0,-(sp)
clr.w -(sp)
move.l #-1,-(sp)
move.w #$0260,-(sp)
move.w #-1,-(sp)
clr.l -(sp)
pea.l 22(sp)
clr.l -(sp)
SXCALL __DMOpen
lea.l 38(sp),sp
movea.l a0,a4
move.l a4,-(sp)
SXCALL __GMSetGraph
addq.l #4,sp
lea.l messageList(pc),a1
moveq.l #0,d1
move.w (a1)+,d1
drawDialogLoop:
move.l (a1),-(sp)
pea.l 4(a1)
SXCALL __GMShadowStrZ
addq.l #8,sp
adda.l d1,a1
move.w (a1)+,d1
bne drawDialogLoop
clr.l -(sp)
SXCALL __DMControl
move.l a4,(sp)
SXCALL __DMDispose
move.l a3,(sp)
SXCALL __MMHdlDispose
addq.l #4,sp
moveq.l #-1,d0
rts
;ダイアログのアイテムリスト
itemList:
.dc.w 1-1
1: .dc.l 0
.dc.w 128,56,160,74
.dc.b 4,6,4,'確認'
.even
itemListEnd:
;ダイアログに表示するメッセージ
messageList:
.dc.w 2f-1f
1: .dc.w 72,2
.dc.b 'SXKeyW',0
.even
2: .dc.w 2f-1f
1: .dc.w 12,24
.dc.b 'KeyWitch version 2.00 以降',0
.even
2: .dc.w 2f-1f
1: .dc.w 12,40
.dc.b 'が組み込まれていません',0
.even
2: .dc.w 0
;終了処理
tini:
move.l oldKeyInt(a5),-(sp)
move.w #KEYINT,-(sp)
DOS _INTVCS
move.l oldKeyErr(a5),-(sp)
move.w #KEYERR,-(sp)
DOS _INTVCS
lea.l 12(sp),sp
movea.l oldKeyProc(a5),a1
KWCall __KWKeyProc
suba.l a1,a1
KWCall __KWSetTask
moveq.l #0,d2
KWCall __KWIntMode
moveq.l #0,d0
rts
;アクティベイトイベント
activate:
move.l eventRec+tnWhom(a5),d0
beq activate_9
movea.l d0,a0
move.w $6E+2(a0),-(sp)
pea.l tdbPtr(a5)
SXCALL __TSGetTdb
addq.l #6,sp
pea.l tdbPtr(a5)
SXCALL __SXSearchFname
addq.l #4,sp
movea.l a0,a1
KWCall __KWSetTask
activate_9:
moveq.l #0,d0
rts
;タスクマネージャイベント
system1:
system2:
move.w eventRec+tnWhat2(a5),d0
cmp.w #TS_ENDTSK,d0
beq endTask
cmp.w #TS_CLOSEALL,d0
beq closeAll
system_9:
moveq.l #0,d0
rts
endTask:
closeAll:
system_99:
moveq.l #-1,d0
rts
;アイドルイベント
idle:
tst.b releaseFlag(a4)
bne release
moveq.l #0,d0
rts
release:
moveq.l #-1,d0
rts
leftDown:
leftUp:
rightDown:
rightUp:
keyDown:
keyUp:
update:
reserv1:
reserv2:
reserv3:
user1:
user2:
moveq.l #0,d0
rts
.even
moduleTail:
.end execEntry